package com.zql.LeetCode;

import com.zql.baseEntity.ListNode;

/**
 * Created By ShuHua on 2021/8/26.
 */
public class RemoveNthFromEnd_19 {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head==null|| head.next==null) return null;
        ListNode p1=head;
        ListNode p2=head;
        while (n-- >0){
            p1=p1.next;
        }
        while (p1!=null&&p1.next!=null){
            p1=p1.next;
            p2=p2.next;
        }

        if(p2==head&&p1==null){
            head=p2.next;
        }else {
            p2.next=p2.next.next;

        }

        return head;

    }
    public ListNode removeNthFromEnd_error3(ListNode head, int n) {
        if(head==null|| head.next==null) return null;
        ListNode p1=head;
        ListNode p2=head;
        while (n-- >0){
            p1=p1.next;
        }
        while (p1!=null&&p1.next!=null){
            p1=p1.next;
            p2=p2.next;
        }

        //[1,2] 1 =>[2] 预期结果[1]
        //这里p1=2 p2=head 如过按照这个逻辑就会删除头结点，这明显是不对的。
        //所以这种情况就要p2为空的时候才能删除头结点，因为p2为空的话那么就是要删除倒数最后一个元素即删除头结点
        if(p2==head){
            head=p2.next;
        }else {
            p2.next=p2.next.next;

        }

        return head;

    }
    public ListNode removeNthFromEnd_error2(ListNode head, int n) {
        if(head==null|| head.next==null) return null;
        ListNode p1=head;
        ListNode p2=head;
        while (n-- >0){
            p1=p1.next;
        }
        while (p1!=null&&p1.next!=null){
            p1=p1.next;
            p2=p2.next;
        }
        //[1,2] 2  => [1] 但是 预期是[2]
        //因为这个语句可以用来删除中间节点和尾结点，但是不能用来删除头结点
        p2.next=p2.next.next;

        return head;

    }
    public ListNode removeNthFromEnd_error1(ListNode head, int n) {
        if(head==null|| head.next==null) return null;
        ListNode p1=head;
        ListNode p2=head;
        while (n-- >0){
            p1=p1.next;
        }
        //如果节点只有两个元素，取倒数第二元素，此时的p1已经为空，所以会报空指针异常
        //[1,2] 2
        while (p1.next!=null){
            p1=p1.next;
            p2=p2.next;
        }

        p2.next=p2.next.next;

        return head;

    }
}
